<template>
  <view class="uni-table-checkbox" @click="selected">
    <view v-if="!indeterminate" class="checkbox__inner" :class="{'is-checked':isChecked,'is-disable':isDisabled}">
      <view class="checkbox__inner-icon"></view>
    </view>
    <view v-else class="checkbox__inner checkbox--indeterminate">
      <view class="checkbox__inner-icon"></view>
    </view>
  </view>
</template>

<script>
export default {
  name: 'TableCheckbox',
  emits: ['checkboxSelected'],
  props: {
    indeterminate: {
      type: Boolean,
      default: false
    },
    checked: {
      type: [Boolean, String],
      default: false
    },
    disabled: {
      type: Boolean,
      default: false
    },
    index: {
      type: Number,
      default: -1
    },
    cellData: {
      type: Object,
      default() {
        return {}
      }
    }
  },
  watch: {
    checked(newVal) {
      if (typeof this.checked === 'boolean') {
        this.isChecked = newVal
      } else {
        this.isChecked = true
      }
    },
    indeterminate(newVal) {
      this.isIndeterminate = newVal
    }
  },
  data() {
    return {
      isChecked: false,
      isDisabled: false,
      isIndeterminate: false
    }
  },
  created() {
    if (typeof this.checked === 'boolean') {
      this.isChecked = this.checked
    }
    this.isDisabled = this.disabled
  },
  methods: {
    selected() {
      if (this.isDisabled) return
      this.isIndeterminate = false
      this.isChecked = !this.isChecked
      this.$emit('checkboxSelected', {
        checked: this.isChecked,
        data: this.cellData
      })
    }
  }
}
</script>

<style lang="scss">
$checked-color: #007aff;
$border-color: #DCDFE6;
$disable: 0.4;

.uni-table-checkbox {
  display: flex;
  flex-direction: row;
  align-items: center;
  justify-content: center;
  position: relative;
  margin: 5px 0;
  cursor: pointer;

  // 多选样式
  .checkbox__inner {
    /* #ifndef APP-NVUE */
    flex-shrink: 0;
    box-sizing: border-box;
    /* #endif */
    position: relative;
    width: 16px;
    height: 16px;
    border: 1px solid $border-color;
    border-radius: 2px;
    background-color: #fff;
    z-index: 1;

    .checkbox__inner-icon {
      position: absolute;
      /* #ifdef APP-NVUE */
      top: 2px;
      /* #endif */
      /* #ifndef APP-NVUE */
      top: 2px;
      /* #endif */
      left: 5px;
      height: 7px;
      width: 3px;
      border: 1px solid #fff;
      border-left: 0;
      border-top: 0;
      opacity: 0;
      transform-origin: center;
      transform: rotate(45deg);
      box-sizing: content-box;
    }

    &.checkbox--indeterminate {
      border-color: $checked-color;
      background-color: $checked-color;

      .checkbox__inner-icon {
        position: absolute;
        opacity: 1;
        transform: rotate(0deg);
        height: 2px;
        top: 0;
        bottom: 0;
        margin: auto;
        left: 0px;
        right: 0px;
        bottom: 0;
        width: auto;
        border: none;
        border-radius: 2px;
        transform: scale(0.5);
        background-color: #fff;
      }
    }

    &:hover {
      border-color: $checked-color;
    }

    // 禁用
    &.is-disable {
      /* #ifdef H5 */
      cursor: not-allowed;
      /* #endif */
      background-color: #F2F6FC;
      border-color: $border-color;
    }

    // 选中
    &.is-checked {
      border-color: $checked-color;
      background-color: $checked-color;

      .checkbox__inner-icon {
        opacity: 1;
        transform: rotate(45deg);
      }

      // 选中禁用
      &.is-disable {
        opacity: $disable;
      }
    }

  }
}
</style>
